#pragma once


#include <Core/Core.hpp>
#include <glog/logging.h>
#include <string>

//////////////////////////////////////////////////////////////////////////
// Import and typedef some math types so we can easily switch from
// float to double and non-vectorized to vectorized, etc.
#include <Math/Vector3f.hpp>
#include <Math/Vector4f.hpp>
#include <Math/Matrix44f.hpp>

#include <Math/Vector3fv.hpp>
#include <Math/Vector4fv.hpp>
#include <Math/Matrix44fv.hpp>

namespace RayTracer
{
#if 0
	typedef Math::Vector3f								Vector3;
	typedef Math::Vector4f								Vector4;
	typedef Math::Matrix44f								Matrix44;

#else
	typedef Math::Simd::Sse3							SimdType_t;

	typedef Math::Vector3f_Simd< SimdType_t >			Vector3;
	typedef Math::Vector4f_Simd< SimdType_t >			Vector4;
	typedef Math::Matrix44f_Simd< SimdType_t >			Matrix44;
#endif
}


// Helper utility, really don't care about wstring but the JSON library uses it.
// We provide some conversion casts, nasty little things....
template< typename SrcType, typename DstType >
DstType string_cast( const SrcType& )
{
	assert( false );	// No conversion implemented.
}

template< typename DstType >
DstType string_cast( const std::wstring& in )
{
	DstType	result( in.begin(), in.end() );
	return result;
}

template< typename DstType >
DstType string_cast( const std::string& in )
{
	DstType	result( in.begin(), in.end() );
	return result;
}
